<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>

<div id="app">
  <son :pmsg="msg" @change-msg="modify"></son>
</div>

<script src="../node_modules/vue/dist/vue.js"></script>
<script>
  let son = {
    data() {
      return {
        msg: '123'
      }
    },
    template: `<div>{{pmsg}} <button @click="fn">修改</button></div>`,
    props: ['pmsg'],
    methods: {
      fn() {
        this.$emit('change-msg', '12345上山打老虎');
      }
    }
  };

  let vm = new Vue({
    el: '#app',
    data: {
      msg: 'msg from parent'
    },
    methods: {
      modify(val) {
        // console.log(val);
        this.msg = val;
      }
    },
    components: {
      son
    }
  });

  // 子组件传递给父组件通过事件机制，通知父组件，让父组件修改数据；
  // 父组件中使用子组件时要监听一个自定义的事件，如上面的 @change-msg=modify 【事件名不要写驼峰】
  // 当子组件要修改某个数据时调用 this.$emit(事件名, 数据);
  // 子组件$emit 后，父组件收到这个事件会执事件绑定的的方法，方法的形参可以接收子组件$emit的数据

  // 父组件监听事件，给事件绑定一个方法，这个方法有一个形参用于接收子组件$emit的数据
  // 子组件emit事件，并且传入数据
</script>

</body>
</html>